public class Main {
    public static void main(String[] args) {
        // **** Redis ****
        // 用于作为数据库， 用于作为缓存
        // 在分布式系统中能够大展拳脚

        // 那么为什么呢么多公司要用这个 Redis ？
        // 那就要讲讲 Redis 这些优点
        // 在内存中存储数据

        // 第一个特性：
        // MySQL 主要是 通过 “表” 的方式来存储组织数据的， 这样的以 表 的方式来存储组织数据的 叫做  “关系型数据库”
        // Rides 主要是通过 “键值对” 的方式来存储组织数据的 这样的称作 “非关系性数据库”
        //              key 都是 string value 则可以是上述的这些数据结构

        // 第二个特性：
        // 可编程的
        // 针对 Redis 的操作， 可以直接通过简单的交互式命令进行操作
        // 也可以通过一些脚本的方式， 批量执行一些操作（可以带有一些逻辑）

        // 第三个特性：
        // 扩展能力
        // 可以在 Redis 原有的功能基础上再进行扩展. Redis 提供了一组 API
        // 通过这些语言 编写 Redis 扩展（本质上就是一个动态连接库）
        // 自己去扩展 Redis 的功能
        // 比如： Redis 自身已经提供了很多的数据库结构和命令， 通过扩展， 让Redis支持更多的数据结构， 以及支持更多的命令

        // 第四个特性;
        // 持久化
        // Redis 是把数据存储在内存中的
        // 为什么?为了更快速的访问
        // 但是这有一个问题 内存中的数据是易失的， 进程的退出/ 系统重启
        // 此时 Redis 会把数据存储在硬盘上
        // 所以 以 内存为主， 硬盘为辅
        // 硬盘相当于对内存的数据备份了一下
        // 如果 Redis 重启了， 就会在重启时加载硬盘中的备份数据
        // 是 Redis 的内存恢复到之前的状态

        // 第五个特性：
        // 支持 集群
        // Redis 作为一个分布式系统中的中间件， 能够支持集群是很关键的
        // 水平扩展： 意思就类似于 分库分表
        // 一个 Redis 能存储的数据是有限的
        // 如果想要存储多个数据， 就要引入多个主机， 部署多个 Redis 每个 Redis 存储数据的一部分

        // 第六个特性：
        // 高可用
        // 高可用的核心就是 ==> 冗余/备份
        // Redis 自身也是支持 ”主从“结构
        // 从节点就相当于主节点的备份了

        // Redis 最大的优点就是 块
        // 为什么 Redis 快呢？
        // 有这么几个方面
        // 1. Redis 数据在内存中。 就比访问硬盘的数据库 要快的多
        // 2. Redis 核心功能都是比较简单的逻辑 ~~ （核心功能都是比较简单的操作内存的数据结构）
        // 3. 从网络角度上 Redis 使用了 IO 多路复用的方式 （epoll）
        //    （IO 多路复用 就是 使用一个线程来管里很多个 Socket）
        // 4. Redis 使用的是 单线程模型， 更高版本的 Redis 引入了多线程
        //      这样的单线程模型 就减少了不必要的线程之间的竞争开销
        // （多线成提高效率的前提是， CPU 密集型的任务， 使用多线程 可以充分利用 CPU 多核资源）
        //  （但是 对于 Redis 来说， 它的核心任务主要就是操作内存的数据结构~~， 不会吃很多 CPU）
        //  （这时候再搞多个资源，就有些浪费了）

        // Redis 的应用场景
        // 1. 实时的数据存储（把 redis 当作了数据库）
        // 需要更低的延迟和更高的吞吐率， 当前是对数据存储的效率是非常高的
        // 大多数 情况下， 考虑到数据 存储，优先考虑的是 ”大“， 但仍然有一些场景， 考虑的是 ”快“ （如搜索引擎）
        // 此时 Redis 存的是全量数据， 这里的数据是不能随便丢的
        // 2. 作为缓存 或者作为 session 存储
        //      使用 MySql存储数据， 大， 慢
        //      二八原则， 把热点数据拎出来， 存储在 redis 中的
        //  此时 Redis 存的是部分数据， 全量数据都已 MySql 为主， 哪怕Redis 的数据都没了， 还可以从 mysql 这面再加载回来
        //  cookie => 实现用户身份信息保存， 需要 session 配合的
        // cookie 只是在浏览器这边存储了用户表示sessionId  session这里真正存储了用户数据
        // 如何解决上述问题/
        // （1. 想办法让负载均衡器， 把同一个用户的请求始终打到同一个机器上（不能轮询了， 而是通过 userId之类的方式来分配机器）
        // （2. 把会话数据给单独拎出来， 如存储到一组独立的机器上存储 （ redis 当中 ）
        // 3. 消息队列
        // （消息队列： 此处的不是 Linux 进程之间的通信的那个消息队列，
        // 而是一个消息队列的服务器， 基于这个就可以实现一个网络版本的生产者消费者模型 ）
        // （分布式系统来说， 服务器和服务器之间， 有时候也需要使用到生产者消费者模型的~~ 优势： 解耦合，2.削峰填谷）
        // （业界有很多知名的消息队列 RabbitMQ。 Kafka， RocketMQ）
        // （Redis 也是提供了消息队列功能的）
        // 如果当前场景中， 对于消息队列的功能依赖的不是很多， 并且又不像引入额外的依赖的， Redis 可以作为一个选择

        // Redis 不能做的事情？
        // 1. 存储大规模的数据
        // 2. ..........................................

    }
}
